package com.ubigate.CooknaviHA;

import java.io.File;

import zipunzip.CompressionUtil;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;

public class SplashActivity extends Activity {
	private static final String TAG = "SplashActivity";
	
	private static String uniqueID = null;
	
	ProgressDialog mLoading; //로딩 프로그레스 다이얼로그 생성
	DownThread mThread; //다운로드 받는 스레드 생성
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);//splash.xml을 띄움
 
        Context context = this;
        uniqueID = CooknaviApp.id(context);//해당 context에 unigue 아이디를 대입
        Log.d(TAG, "uuid : "+uniqueID);//tomcat에 uuid : uniqueID 찍음
//        //Find the dir to save cached images
//        Log.d(TAG, "External Files Dir : "+getExternalFilesDir(null).getAbsolutePath());
//        if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
//        {
//        	Log.i(TAG, "MEDIA_MOUNTED");
//            app.cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"CooknaviHA");
//        }
//        else
//        {
////        	app.cacheDir=this.getCacheDir();
////            if(!app.cacheDir.exists())
////            	app.cacheDir.mkdirs();
//        	Log.i(TAG,"SDCARD 없음.. 안내창 띄우고 앱 종료..");
//        	Toast.makeText(SplashActivity.this, "SDCARD가 없으면 이용하실 수 없습니다.", 3000).show();
//            Handler mHandler = new Handler();
//            mHandler.postDelayed(new Runnable() {
//            	public void run()
//            	{        	
//                	android.os.Process.killProcess(android.os.Process.myPid());
//                	onBackPressed();
//            	}
//            }, 3000);
//        }

        mLoading = new ProgressDialog(SplashActivity.this);//SplashActivity에 progress dialog 생성
        mLoading.setMessage("로딩중입니다....");//progress dialog가 실행될때 뜨는 message 설정
        mLoading.setIndeterminate(true);//진행상황에 상관없이 계속 작업중이라고 표현
        mLoading.setProgressStyle(ProgressDialog.STYLE_SPINNER);//progress style을 STYLE_SPINNER로 설정
        mLoading.setCancelable(true);//dialog가 실행된 상태에서 취소버튼을 클릭하면 화면을 취소할 수 있음
        
        Intent intent = getIntent();
       
        if (intent.getAction().equals(Intent.ACTION_VIEW)) {
        	// 파일 연결 실행
        	String filepath = intent.getData().getPath();

        	int idxFilenameStart = filepath.lastIndexOf("/"); //파일이름의 첫번째 인덱스
        	int idxFilenameEnd = filepath.lastIndexOf("."); //파일 이름의 마지막 인덱스
        	String path = filepath.substring(0, idxFilenameStart);
        	String filename = filepath.substring(idxFilenameStart+1,idxFilenameEnd);//파일 경로에서 파일이름 찾아 filename에 대입
        	
        	Log.i(TAG,"filepath = "+filepath+", filename = "+filename+", dest = "+path+"/"+filename );//tomcat에 log찍기

        	try {
            	CompressionUtil cu = new CompressionUtil();
            	File destDir = new File(path+"/"+filename);//파일경로를 통해 파일 생성
            	if (destDir.exists() == false) {//존재여부 판단 존재하지 않을 경우
            		destDir.mkdirs();//디렉토리를 생성
            	}
            	cu.unzip(new File(filepath), destDir, "MS949");//압축된 파일 경로를 목적지디렉토리에 MS949이름으로 압축을 품
        		((CooknaviApp)getApplicationContext()).setContentPath(path+"/"+filename);// 경로를 설정
            	((CooknaviApp)getApplicationContext()).LoadXMLRecipes(destDir+"/"+filename+".xml");//xml파일들 로드
                ((CooknaviApp)getApplicationContext()).ParseXMLRecipes();
        		((CooknaviApp)getApplicationContext()).ParseRecipe();
        		
        		// SplashActivity에서 ContentActivity로 전환하도록 newIntent 생성
        		Intent newIntent = new Intent(SplashActivity.this, ContentActivity.class);
        		//newIntent 활서화
                startActivity(newIntent);
                finish();

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	
        	Log.i(TAG,filename+" Uncompressed.");// tomcat으로 log찍음
        } else {
        	Log.i(TAG,"앱 직접 실행.");//tomcat에 log찍음
        	if (((CooknaviApp)getApplicationContext()).getNetworkState() == 0) {//network상태 확인 인터넷 연결이 안되있을 경우
    			Toast.makeText(SplashActivity.this, "인터넷 연결을 확인하시고 다시 실행해 주세요.", 3000).show();//toast로 현재 activity에 메시지 띄워줌
    			Handler mHandler = new Handler();	//핸들러 사용
    			//postDelayed를 사용하면 일정 시간이 지난 후에 함수를 동작시킬 수 있다.
    			//그러기 위해선 Runnable을 통하여 동작을 구성해야함.
    			mHandler.postDelayed(new Runnable() {
	    			public void run()
	    			{        	
		    			android.os.Process.killProcess(android.os.Process.myPid());//현재 프로세스를 종료시킴
	    			}
    			}, 3000);//3초후에 display
        	} else {
	            mLoading.show();//process dialog를 띄움
	            mThread = new DownThread(ServiceUrls.sMainUrl); //데이터를 가져올 서비스 url을 포함해 thread 생성
	            mThread.start();//thread실행
	//            setProgressBarVisibility(false);
	            
	        	
	        	//Toast.makeText(SplashActivity.this, "올바른 콘텐츠 파일을 선택해주세요.", 3000).show();
	//            Handler mHandler = new Handler();
	//            mHandler.postDelayed(new Runnable() {
	//            	public void run()
	//            	{        	
	//            		mLoading.cancel();
	//            		mLoading.dismiss();
	//            		
	//            		Intent newIntent = new Intent(SplashActivity.this, CooknaviHAActivity.class);
	//            		startActivity(newIntent);
	//                	finish();
	//                	//android.os.Process.killProcess(android.os.Process.myPid());
	//            	}
	//            }, 300);
        	}
        }
    }

    //다운로드를 받는 작업 스레드
    class DownThread extends Thread {
    	String mAddr;	//데이터를 가져올 서비스 URL 주소
    	
    	DownThread(String addr) {//데이터를 가져올 url주소를 받는 생성자
    		mAddr = addr;
    	}
    	
    	public void run() {
    		DownloadItems(mAddr);//url에서 데이터를 받음
    		
    		
    		mAfterDown.sendEmptyMessage(0);//sendEmptyMessage 메소드로 빈 메세지를 보냄으로서 핸들러 호출
    	}
    }
    
    //데이터를 다운로드 하기위한 메소드
    void DownloadItems(String mAddr) {
		Log.d(TAG, "DownThread-DownloadItems");
        if (((CooknaviApp)getApplicationContext()).jMainItems.bInitialized == false) {
    		((CooknaviApp)getApplicationContext()).jMainItems.getItems(mAddr);//데이터를 받음
        }

    }
    //핸들러 생성해서 메시지를 수신할 곳을 설정
    Handler mAfterDown = new Handler() {
    	//해당 thread의 메시지 큐에 메시지가 존재하는 경우 handleMessage()메소드 호출
    	public void handleMessage(Message msg) {
    		boolean bMainInit = ((CooknaviApp)getApplicationContext()).jMainItems.bInitialized;//데이터를 제대로 다운 받았는지 확인
    		Log.d(TAG, "DownThread-mAfterDown bInit :"+bMainInit);//tomcat에 log를 찍어줌
    		//프로그래스 대화상자를 종료합니다.
    		mLoading.dismiss();
    		
    		if (bMainInit) {
    			//intent를 이용해 SplashActivity에서 CooknaviHAActivity로 전환
	    		Intent newIntent = new Intent(SplashActivity.this, CooknaviHAActivity.class);
	    		//intent활성화
	    		startActivity(newIntent);
	    		//핸들러 종료
	        	finish();
    		} else {//제대로 데이터를 받지 못한경우
    			//현재 activity에 toast 메시지를 2초동안 띄워줌
    			Toast.makeText(SplashActivity.this, "서버로부터 데이터를 가져올 수 없습니다. 잠시 후 다시 이용해 주세요.", 2000).show();
    			//핸들러 사용해 지연
    			Handler mHandler = new Handler();
    			//postDelayed를 사용하면 일정 시간이 지난 후에 함수를 동작시킬 수 있다.
    			//그러기 위해선 Runnable을 통하여 동작을 구성해야함.
    			mHandler.postDelayed(new Runnable() {
	    			public void run()
	    			{        	
		    			android.os.Process.killProcess(android.os.Process.myPid());//process 종료
	    			}
    			}, 2000);//2초후에 display
    		}
    	}
    };    
}
